﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using System.Xml;

namespace DeckOfCards.Domain
{
    [TestFixture]
    class TestFixture
    {
          
          
        [Test]
        public void IlMazzoDovrebbeAvereZeroOPiuCarte()
        {
            Mazzo mazzoDaTestare = new Mazzo();
     
            Assert.GreaterOrEqual(mazzoDaTestare.Count,0);
        }

        [Test]
        public void  UnNuovoMazzoNonDovrebbeAvereCarte ()
        {
            Mazzo nuovoMazzo = new Mazzo();
            // d.Cards.length array...
            // d.Cards.count colleciton, list, queue, arraylist, sortedlist, stack.... 
            Assert.AreEqual(0,nuovoMazzo.Count);
        }

        [Test]
        public void AggiungendoUnaCartaAdUnNuovoMazzoDovremmoAvereUnMazzoConUnaCarta  ()
        {
            //given a new mazzo

            DefinizioneMazzo nuovaDefinizioneMazzo = CreaDefMazzoDi52Carte();
            Mazzo nuovoMazzo = new Mazzo(nuovaDefinizioneMazzo);

            //creare una carta.
            Carta nuovaCarta = new Carta(Carta.ValoreDiFacciataEnum.Otto,Seme.GetSeme("Quadri"));
           
            //where we have added a card.
            nuovoMazzo.AggiungereCarta(nuovaCarta);

            //Mazzo.AggiungereCarta(c);

            //then there should be one card.
            Assert.AreEqual(1, nuovoMazzo.Count); 
            
        }

        [Test]
        public void IlNumeroDiCarteNellaDefinizioneSiaCoretto() { 
            //Dato
            //ho una definizione di 5 carte
            //il conteggio mi torna 5
        }

        [Test]
        public void UnaDefinizioneDi52CarteDovrebbeTornareUnContegggioDi52()
        {
            //Dato
            DefinizioneMazzo Def = CreaDefMazzoDi52Carte();

            //Quando...

            //Esce
            Assert.AreEqual(52, Def.ConteggioCarte());
        }

        [Test]
        public void DaUnaDefinizioneDiUnNuovoMazzoDovremmoGenerareUnMazzoConLeCarte()
        {

            //Dato
            DefinizioneMazzo Def = CreaDefMazzoDi52Carte();
            Mazzo newMazzo;
            
            //Quando
            newMazzo = MazzoFabrica.CreareMazzoDaDefinizione(Def);

            //Esce
            Assert.AreEqual(Def.ConteggioCarte(), newMazzo.Count);

        }

        [Test]
        public void CaricareUnaDefinizioneDaXML()
        {
            //Dato
            XmlDocument xml = GetDefinitionXmlFor52Carte();

            //Given
            DefinizioneMazzoFabrica fabrica;

            DefinizioneMazzo loadedFromXml = null; // = fabrica.CreaDefinizioneDaXML(xml);
            DefinizioneMazzo manuallyCreated = CreaDefMazzoDi52Carte();
            Assert.True(manuallyCreated.Equals(loadedFromXml)); 
        }

        private XmlDocument GetDefinitionXmlFor52Carte()
        {
            XmlDocument xml=null;
            DefinizioneMazzo Def = CreaDefMazzoDi52Carte();
            //XmlDocument xml = Def.Serialize();
            return xml;
        }

        private DefinizioneMazzo CreaDefMazzoDi52Carte()
        {
            DefinizioneMazzo nuovaDefinizioneMazzo = new DefinizioneMazzo();

            string[] semiRossi= new string[] {"Quadri","Cuori"};

            foreach (string suitname in semiRossi)
            {
                DefinizioneSeme defseme = CreaSemeDi13Carte(Seme.GetSeme(suitname));
                defseme.Colore="Rosso";
                nuovaDefinizioneMazzo.AddSeme(defseme);
            }

            string[] semiNeri= new string[] {"Fiori","Picche"};
            foreach (string suitname in semiRossi)
            {
                DefinizioneSeme defseme = CreaSemeDi13Carte(Seme.GetSeme(suitname));
                defseme.Colore="Nero";
                nuovaDefinizioneMazzo.AddSeme(defseme);
            }
            return nuovaDefinizioneMazzo;
        }

        private DefinizioneSeme CreaSemeDi13Carte(Seme SemeDaCreare)
        {
            DefinizioneSeme DefSeme = new DefinizioneSeme();
            DefSeme.Nome = SemeDaCreare.Nome;
            DefSeme.Colore = SemeDaCreare.Colore;
            DefSeme.Valori = new List<Carta.ValoreDiFacciataEnum>();
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Asso);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Due);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Tre);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Quattro);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Cinque);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Sei);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Sette);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Otto);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Nove);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Dieci);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Fante);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Donna);
            DefSeme.Valori.Add(Carta.ValoreDiFacciataEnum.Re);
            return DefSeme;
        }

        //[Test]
        //public void AggiungendoDueCarteAdUnNuovoMazzoDovremmoAvereUnMazzoConDueCarte()
        //{
        //    DefinizioneMazzo newMazzoDefinizione = new DefinizioneMazzo();
        //    Mazzo nuovoMazzo=Mazzo.CreaMazzo(newMazzoDefinizione);
        //    Assert.AreEqual(2,nuovoMazzo.Carte.Count);
        //}
          
        [Test]
        public void IlSemePotrebbeAvereUnColore ()
        {
            Seme nuovoSeme  = Seme.GetSeme("Quadri");
            nuovoSeme.Colore = "Rosso";
            Assert.AreEqual("Rosso", nuovoSeme.Colore);
        }    

        [Test]
        public void LaCartaConSemeDovrebbeAvereUnValoreEdUnSeme ()
        {

            Seme nuovoSeme = Seme.GetSeme("Quadri");
            nuovoSeme.Colore = "Rosso";
            Carta nuovaCartaSeme = new Carta(Carta.ValoreDiFacciataEnum.Fante, nuovoSeme);

            Assert.AreEqual("Quadri",nuovaCartaSeme.Seme.Nome);
            Assert.AreEqual(Carta.ValoreDiFacciataEnum.Fante,nuovaCartaSeme.ValoreDiFacciata);
        }




    }
}
